package com.hk.commons.util;


import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import java.util.Objects;
import java.util.function.Supplier;

/**
 * 对象工具类
 *
 * @author kevin
 * @date 2017年10月20日上午9:40:39
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public abstract class ObjectUtils {

    /**
     * 对象默认值
     *
     * @param object       object
     * @param defaultValue defaultValue
     * @return object
     */
    public static <T> T defaultIfNull(final T object, final T defaultValue) {
        return Objects.nonNull(object) ? object : defaultValue;
    }

    /**
     * 对象默认值
     *
     * @param object   object
     * @param supplier supplier
     */
    public static <T> T defaultIfNull(final T object, Supplier<T> supplier) {
        return Objects.nonNull(object) ? object : supplier.get();
    }

    /**
     * <pre>
     * ObjectUtils.isBlank(null) ; true
     * ObjectUtils.isBlank("") ; true
     * ObjectUtils.isBlank("  ") ; true
     * </pre>
     *
     * @param object object
     * @return true if blank
     */
    public static boolean isBlank(Object object) {
        return StringUtils.isBlank(toString(object));
    }

    /**
     * @param obj obj
     * @return true if notEmpty
     */
    public static boolean isNotEmpty(Object obj) {
        return !org.springframework.util.ObjectUtils.isEmpty(obj);
    }

    /**
     * <pre>
     * ObjectUtils.isBlank(null) ; false
     * ObjectUtils.isBlank("") ; false
     * ObjectUtils.isBlank("  ") ; false
     * </pre>
     *
     * @param object object
     * @return true if not blank
     */
    public static boolean isNotBlank(Object object) {
        return !isBlank(object);
    }

    /**
     * 对象的 toString 表现形式
     *
     * @param obj obj
     * @return toString
     */
    public static String toString(Object obj) {
        return switch (obj) {
            case null -> null;
            case String str -> str;
            case byte[] bytes -> byteToString(bytes);
            case char[] chars -> charToString(chars);
            default -> obj.toString();
        };
    }

    /**
     * char 数组转换为 string
     *
     * @param chars chars
     * @return char -> string
     */
    public static String charToString(char[] chars) {
//        var sb = new StringBuilder();
//        for (var item : chars) {
//            sb.append(item);
//        }
//        return sb.toString();
        return new String(chars);
    }

    /**
     * byte 数组转换为 string
     *
     * @param bytes bytes
     * @return byte -> string
     */
    public static String byteToString(byte[] bytes) {
        return new String(bytes);
    }

}
